package com.sca;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

/**
 * @Desc: 订单微服务控制器 - 单一方式降级（方式1）
 * @Author: hwx
 * @Date: 2020/5/26 14:21
 * @Version: v1.0
 **/
@RestController
@RequestMapping(value = "/order")
public class OrderController {

	@Autowired
	private RestTemplate restTemplate;



	/**
	 * @desc: 基于ribbon的形式调用远程微服务
	 * 1.使用@LoadBalanced声明RestTemplate
	 * 2.使用服务名称替换ip地址
	 *
	 *  注意：启动类中设置@LoadBalanced开启ribbon后，会使用负载均衡，需要使用服务名称进行调用，
	 *  		因为每次都是调用同一个服务，当使用的是服务名称的时候，会根据自己的算法去选择具有该服务名称的服务。
	 *
	 * 使用 @HystrixCommand 注解配置熔断保护
	 * 		属性fallbackmethod : 配置熔断之后的降级方法
	 *
	 * @author: hwx
	 * @date: 2020/5/26 16:04 
	 * @param: id -> 商品id
	 * @return:
	 */
	@HystrixCommand(fallbackMethod = "orderFallBack")//指定熔断之后的降级方法
	@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
	public String findByServiceName(@PathVariable Integer id) {
		//使用服务名称调用
		String product = restTemplate.getForObject("http://srv/product/" + id, String.class);
		return product;
	}

	/**
	 * 单一方式:
	 *  降级方法和需要受到保护的方法的返回值一致 ,方法参数一致
	 */
	public String orderFallBack(Integer id) {
		return "单一触发降级方法";
	}
}
